package main

import "sync"

/*
死锁
	当前程序中的主goroutine以及我们启动用的goroutine都已经被阻塞。这时整个程序都已经停止不前了。
死锁属于"运行时抛出的panic", 一旦死锁，程序必然崩溃
	Go语言运行时抛出的panic都属于致命错误，都是无法被恢复的，调用recover函数也不起作用

锁定已经锁定的互斥锁	->	死锁，panic,无法捕获
解锁未锁定的互斥锁		-> 	panic,无法捕获

读写锁
	对共享资源的读操作和写操作区别对待
	对两种操作施加不同程度的保护，相比互斥锁，读写锁能够实现更加细腻的访问控制
	读锁：
		sync.RWMutex类型中Lock方法和Unlock方法分别用于对写锁进行锁定和解锁
	写锁：
		sync.RWMutex类型中RLock方法和RUnlock方法分别用于对读锁进行锁定和解锁
	对同一个读写锁来说有如下规则：
		1. 在写锁锁定的情况下，再试图锁定写锁，会阻塞当前goroutine
		2. 在写锁锁定的情况下，再试图锁定读锁，会阻塞当前goroutine
		3. 在读锁锁定的情况下，再试图锁定写锁，会阻塞当前goroutine
		4. 在读锁锁定的情况下，再试图锁定读锁，不会阻塞当前goroutine
	Go语言的读写锁时对互斥锁的拓展
*/

func main() {

	var m sync.Mutex
	m.Lock()
	m.Lock()
}
